[GBase 8s 教程]GBase 8s 连接(JOIN)

您所在的位置:网站首页 数据库中left join的用法 [GBase 8s 教程]GBase 8s 连接(JOIN)

[GBase 8s 教程]GBase 8s 连接(JOIN)

2024-05-26 17:32| 来源: 网络整理| 查看: 265

GBase 8s JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。 在 GBase 8s 中,JOIN 有五种连接类型:

CROSS JOIN :交叉连接INNER JOIN:内连接LEFT OUTER JOIN:左外连接RIGHT OUTER JOIN:右外连接FULL OUTER JOIN:全外连接

接下来让我们创建两张表 COMPANY 和 DEPARTMENT。 实例 创建 COMPANY 表 ,数据内容如下:

DROP TABLE IF EXISTS COMPANY; CREATE TABLE COMPANY( ID SERIAL PRIMARY KEY, NAME VARCHAR(40) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY DECIMAL(10,2), JOIN_DATE DATE DEFAULT TODAY ); INSERT INTO COMPANY VALUES (0, '李雷', 37, '北京', 20000.00,'2005-05-13'); INSERT INTO COMPANY VALUES (0, '韩梅梅', 35, '天津', 16000.00, '2007-12-18'); INSERT INTO COMPANY VALUES (0, '林涛', 36, '上海', 25000.00, '2006-01-04'); INSERT INTO COMPANY VALUES (0, '魏华', 36, '西安', 15000.00, '2007-08-30'); INSERT INTO COMPANY VALUES (0, '露茜', 34, '伦敦', 22000.00, '2008-08-08'); INSERT INTO COMPANY VALUES (0, '莉莉', 34, '伦敦', 22000.00, '2008-08-08'); INSERT INTO COMPANY VALUES (0, '吉姆', 35, '华盛顿', 16000.00, '2010-12-13'); INSERT INTO COMPANY VALUES (0, '汤姆', 36, '渥太华', 21000.00, '2010-04-30');

此时,COMPANY 表的记录如下:

idnameageaddresssalaryjoin_date1李雷37北京20000.002005-05-132韩梅梅35天津16000.002007-12-183林涛36上海25000.002006-01-044魏华36西安15000.002007-08-305露茜34伦敦22000.002008-08-086莉莉34伦敦22000.002008-08-087吉姆35华盛顿16000.002010-12-138汤姆36渥太华21000.002010-04-30

创建一张 DEPARTMENT 表,添加三个字段:

DROP TABLE IF EXISTS DEPARTMENT; CREATE TABLE DEPARTMENT ( ID SERIAL PRIMARY KEY, DEPT CHAR(50) NOT NULL, EMP_ID INT references COMPANY(ID) ); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (0, '研发部', 1 ); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (0, '市场部', 5 ); INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) VALUES (0, '人力资源部', 2);

此时,DEPARTMENT 表的记录如下:

iddeptemp_id1研发部12市场部53人力资源部2 交叉连接

交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 行,则结果表有 x*y 行。 由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。

下面是 CROSS JOIN 的基础语法:

SELECT ... FROM table1 CROSS JOIN table2 ...

基于上面的表,我们可以写一个交叉连接(CROSS JOIN),如下所示:

select * from company cross join department;

得到结果如下:

idnameageaddresssalaryjoin_dateiddeptemp_id1李雷37北京20000.002005-05-131研发部12韩梅梅35天津16000.002007-12-181研发部13林涛36上海25000.002006-01-041研发部14魏华36西安15000.002007-08-301研发部15露茜34伦敦22000.002008-08-081研发部16莉莉34伦敦22000.002008-08-081研发部17吉姆35华盛顿16000.002010-12-131研发部18汤姆36渥太华21000.002010-04-301研发部11李雷37北京20000.002005-05-132市场部52韩梅梅35天津16000.002007-12-182市场部53林涛36上海25000.002006-01-042市场部54魏华36西安15000.002007-08-302市场部55露茜34伦敦22000.002008-08-082市场部56莉莉34伦敦22000.002008-08-082市场部57吉姆35华盛顿16000.002010-12-132市场部58汤姆36渥太华21000.002010-04-302市场部51李雷37北京20000.002005-05-133人力资源部22韩梅梅35天津16000.002007-12-183人力资源部23林涛36上海25000.002006-01-043人力资源部24魏华36西安15000.002007-08-303人力资源部25露茜34伦敦22000.002008-08-083人力资源部26莉莉34伦敦22000.002008-08-083人力资源部27吉姆35华盛顿16000.002010-12-133人力资源部28汤姆36渥太华21000.002010-04-303人力资源部2 内连接

内连接(INNER JOIN)根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。查询会把 table1 中的每一行与 table2 中的每一行进行比较,找到所有满足连接谓词的行的匹配对。 当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行。 内连接(INNER JOIN)是最常见的连接类型,是默认的连接类型。 INNER 关键字是可选的。

下面是内连接(INNER JOIN)的语法:

SELECT table1.column1, table2.column2... FROM table1 INNER JOIN table2 ON table1.common_filed = table2.common_field;

基于上面的表,我们可以写一个内连接,如下所示:

SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;

得到结果如下:

emp_idnamedept1李雷研发部5露茜市场部2韩梅梅人力资源部 左外连接

外部连接是内部连接的扩展。SQL 标准定义了三种类型的外部连接: LEFT、RIGHT 和 FULL, GBase 8s 支持所有这些。 对于左外连接,首先执行一个内连接。然后,对于表 T1 中不满足表 T2 中连接条件的每一行,其中 T2 的列中有 null 值也会添加一个连接行。因此,连接的表在 T1 中每一行至少有一行。

下面是左外连接( LEFT OUTER JOIN )的基础语法:

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

基于上面两张表,我们可以写个左外连接,如下:

SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;

得到结果如下:

emp_idnamedept1李雷研发部2韩梅梅人力资源部林涛魏华5露茜市场部莉莉吉姆汤姆 右外连接

首先,执行内部连接。然后,对于表T2中不满足表T1中连接条件的每一行,其中T1列中的值为空也会添加一个连接行。这与左联接相反;对于T2中的每一行,结果表总是有一行。 下面是右外连接( RIGHT OUT JOIN)的基本语法:

SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...

基于上面两张表,我们建立一个右外连接:

SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;

得到结果如下:

emp_idnamedept1李雷研发部5露茜市场部2韩梅梅人力资源部 外连接

首先,执行内部连接。然后,对于表 T1 中不满足表 T2 中任何行连接条件的每一行,如果 T2 的列中有 null 值也会添加一个到结果中。此外,对于 T2 中不满足与 T1 中的任何行连接条件的每一行,将会添加 T1 列中包含 null 值的到结果中。 下面是外连接的基本语法:

SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...

基于上面两张表,可以建立一个外连接:

SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.EMP_ID;

得到结果如下:

emp_idnamedept1李雷研发部2韩梅梅人力资源部林涛魏华5露茜市场部莉莉吉姆汤姆


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3